iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Python

探索 Python 世界:從語法基礎到圖像魔法系列 第 21

探索 Python 世界:從語法基礎到圖像魔法 Day21

  • 分享至 

  • xImage
  •  

讓開發者更輕鬆操作資料庫的工具 SQLAlchemy

SQLAlchemy是什麼?

SQLAlchemy 是可以用來存取資料庫的套件,屬於 ORM 框架,只需要 Python 的語法,ORM 會自動將 Python 映射到對應的 SQL 語法,進行資料庫存取

SQLAlchemy 應用 (主要會示範CRUD:增、刪、查、改)

利用 SQLAlchemy 建立一個 SQLite 資料庫

1. 先把要用的模組、功能、工具載入

```
# 從 SQLAlchemy 引入需要的功能,包括創建資料庫引擎、定義表格結構和聚合函數
from sqlalchemy import create_engine, Column, Integer, String, Float, func

# 從 SQLAlchemy 引入 ORM 工具,用於定義基礎類和創建會話
from sqlalchemy.orm import declarative_base, sessionmaker
```

2. 建立資料庫

# 創建資料庫引擎,連接到 SQLite 資料庫 'ex.db'
engine = create_engine('sqlite:///ex.db')

3. 建立 Base 類,使所有 ORM 繼承這個類別

# 創建 Base 類,所有的 ORM 類將繼承這個類
Base = declarative_base()

4. 定義 ORM 類對應 'sales' 表

# 定義 ORM 類 Sales,對應 'sales' 表格
class Sales(Base):
    __tablename__ = 'sales'  # 設定表格名稱為 'sales'

# 定義表格結構
id = Column(Integer, primary_key=True)  # id 欄位,資料類型為整數(Integer),並設為主鍵
product = Column(String)  # product 欄位,資料類型為字串(String),儲存產品名稱
quantity = Column(Integer)  # quantity 欄位,資料類型為整數(Integer),儲存銷售數量
price = Column(Float)  # price 欄位,資料類型為浮點數(Float),儲存產品單價

# 創建所有表格,根據 Base 類中的模型定義
Base.metadata.create_all(engine)

5. 創建會話

Session = sessionmaker(bind=engine) # 創建 Session 類,並將其與資料庫引擎綁定
session = Session() # 創建 Session 實例,用於管理資料庫事務

6. C(創建Create):插入新數據

new_sales = [
Sales(product='Product A', quantity=10, price=9.99),
Sales(product='Product B', quantity=20, price=19.99),
Sales(product='Product C', quantity=5, price=14.99),
Sales(product='Product D', quantity=15, price=24.99)
]
session.add_all(new_sales) # 將新記錄加入會話中
session.commit() # 提交會話,將修改內容存到資料庫
print("資料創建成功。")

7. R(讀取Read):查詢資料

print("原始數據:")
results = session.query(Sales).all()
for result in results:  # 遍歷查詢結果
    print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")

8. U(更新Update):更新資料

# 更新 'Product A' 的價格
session.query(Sales).filter(Sales.product == 'Product A').update({Sales.price: 10.99})
# 提交會話,保存更改
session.commit()
print("資料更新成功。")

9. D(刪除Delete):刪除資料

# 刪除 'Product B'
session.query(Sales).filter(Sales.product == 'Product B').delete()
# 提交會話,儲存修改後的資料
session.commit()
print("資料刪除成功。")

10. 檢視修改後的完整內容

print("修改後的資料:")
updated_results = session.query(Sales).all()
for result in updated_results:  # 遍歷查詢結果
    print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")

11. 關閉會話

session.close()

SQLAlchemy 實作

完整程式:

from sqlalchemy import create_engine, Column, Integer, String, Float, func
from sqlalchemy.orm import declarative_base, sessionmaker

# 創建資料庫引擎,連接到 SQLite 資料庫 'ex.db'
engine = create_engine('sqlite:///ex.db')

# 創建 Base 類,所有的 ORM 類將繼承這個類
Base = declarative_base()

# 定義 ORM 類 Sales,對應 'sales' 表格
class Sales(Base):
    __tablename__ = 'sales'  # 設定表格名稱為 'sales'

    # 定義表格結構
    id = Column(Integer, primary_key=True)  # id 欄位,資料類型為整數(Integer),並設為主鍵
    product = Column(String)  # product 欄位,資料類型為字串(String),儲存產品名稱
    quantity = Column(Integer)  # quantity 欄位,資料類型為整數(Integer),儲存銷售數量
    price = Column(Float)  # price 欄位,資料類型為浮點數(Float),儲存產品單價

# 創建所有表格,根據 Base 類中的模型定義
Base.metadata.create_all(engine)

# 創建 Session 類,並將其與資料庫引擎綁定
Session = sessionmaker(bind=engine)

# 創建 Session 實例,用於管理資料庫事務
session = Session()

# Create 創建
new_sales = [
    Sales(product='Product A', quantity=10, price=9.99),
    Sales(product='Product B', quantity=20, price=19.99),
    Sales(product='Product C', quantity=5, price=14.99),
    Sales(product='Product D', quantity=15, price=24.99)
]

# 將新記錄加入會話中
session.add_all(new_sales)
# 提交會話,將修改內容存到資料庫
session.commit()
print("資料創建成功。")


# Read 讀取所有記錄
print("原始數據:")
results = session.query(Sales).all()
for result in results:  # 遍歷查詢結果
    print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")

# Update 更新 'Product A' 的價格
session.query(Sales).filter(Sales.product == 'Product A').update({Sales.price: 10.99})
# 提交會話,保存更改
session.commit()
print("資料更新成功。")

# Delete刪除 'Product B'
session.query(Sales).filter(Sales.product == 'Product B').delete()
# 提交會話,儲存修改後的資料
session.commit()
print("資料刪除成功。")

# 列印修改後的銷售記錄
print("修改後的資料:")
updated_results = session.query(Sales).all()  
for result in updated_results:  # 遍歷查詢結果
    print(f"id: {result.id}, product: {result.product}, quantity: {result.quantity}, price: {result.price}")

# 關閉會話
session.close()

輸出結果:
image

參考資料:
https://hackmd.io/@shaoeChen/B1CJAsHJ3

https://medium.com/@highsunday0630/python-%E5%AD%98%E5%8F%96%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84%E5%A5%97%E4%BB%B6-sqlalchemy-903259f25e88


上一篇
探索 Python 世界:從語法基礎到圖像魔法 Day20
下一篇
探索 Python 世界:從語法基礎到圖像魔法 Day22
系列文
探索 Python 世界:從語法基礎到圖像魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言